﻿#ifndef MACHINE_H
#define MACHINE_H

#include "tcpclient.h"
#include "comport.h"
#include "datafile/datafiledsr.h"

#include <QThread>
#include <QTimer>
#include <QDebug>

#include "comm/datadef.h"
#include "comm/protocol.h"

#define USE_TCP_COMM    0
#define USE_SERIAL_COMM 1

class Machine: public QObject
{
    Q_OBJECT

public:
    explicit Machine(QObject *parent = NULL);
    virtual ~Machine();

public:
    void initConnectMode(s16 val = 0);//初始化通讯连接方式
    void setConfigFileName(QString configfilename);
    void setComportName(QString portName);//设置串口名称
    QString getConfigFileName();
    int startCommunication();

private:
    QString m_configFileName;

private:
    s16 m_connectMode;  //通讯连接方式 0:网口，1:串口
    // 通讯线程和网络连接
    QThread * m_pTcpThread;
    TcpClient * m_pTcpClient;
    QThread * m_pComThread;
    ComPort * m_pComPort;

    // 连接
public:
    inline int isConnected() const  {  return m_connected; }

private:
    int m_startComm;
    int m_connected;        // 机器连接状态. 0, 未连接; 1, 连接中; 2,

signals:            // 发送数据到机器的信号
    void siSendData(QByteArray dat);
    void siSendDataDone();

private slots:      // 和线程通讯的槽
    void slotConnectSta(int sta);           // 连接状态改变的槽函数
    void slotConnectErr(QString errinfo);   // 接收到通讯错误槽函数
    void slotReceiveData(QByteArray dat);   // 接收到数据的槽函数

//----------------------------------------
// 通讯命令

    // 机器信息
public:
private:

    // 机器状态
public:
    inline int isStatusEn() const   {   return m_statusEn;  }
    inline const MCStatus & getMcStatus() {m_statusEn = 0;   return m_mcStatus;  }
    void setMcStatusAsMc(u8 * buff, int toggle);

    //机器信息
    inline const MCInfo &getMcInfo(){return m_mcInfo;}
    //物联数据
    inline const McLotData &getMcLotData(){return m_lotData;}
    //调试信息
    inline const DebugInfo &getDebugInfo(){return m_debugInfo;}

private:
    int m_statusEn;         // 状态有效标志
    int m_statusToggle;
    MCStatus m_mcStatus;    // 机器状态
    MCInfo m_mcInfo;   // 机器信息
    McLotData m_lotData;  // 物联数据
    DebugInfo m_debugInfo;//调试信息

    // 机器参数
public:
    inline const ParaStruct & getMcPara() {/*m_mcParaEn = 0; */  return m_mcPara;  }
    inline const ParaStruct & getWkPara() {/*m_wkParaEn = 0; */  return m_wkPara;  }
    inline const KnifeGapPara & getGainPara() {  return m_gainPara;  }
    inline const ParaStruct & getPreMcPara() {/*m_mcParaEn = 0; */  return m_mcPrePara;  }
    inline const ParaStruct & getPreWkPara() {/*m_wkParaEn = 0; */  return m_wkPrePara;  }

private:
    ParaStruct m_mcPara;    // 机器参数信息 配置信息
    ParaStruct m_wkPara;    // 工作参数信息
    ParaStruct m_mcPrePara;    // 机器预留参数
    ParaStruct m_wkPrePara;    // 工作预留参数
    KnifeGapPara m_gainPara;
    int m_mcParaEn;
    int m_wkParaEn;
    int m_gainParaEn;//电机增益参数
    int m_mcPreParaEn;
    int m_wkPreParaEn;

public:
    inline int isSensorBmpEn() const   {   return m_sensorBmpEn;  }
    inline const SensorsBitmap & getSensorDat() {/* m_sensorStaEn = 0; */  return m_sensorsStaDat;  }
    inline const SensorsBitmap & getSensorBmp() {/* m_sensorBmpEn = 0; */  return m_sensorEnBmp;    }
    inline int getTotalSendNum() { return m_totalSendNum; }
    inline int getTotalPacketNum() { return m_totalPacketNum; }

private:
    SensorsBitmap m_sensorsStaDat;    // 传感器信号状态位图
    SensorsBitmap m_sensorEnBmp;      // 传感器信号有效位图
    int m_sensorStaEn;
    int m_sensorBmpEn;

public:
    void setTcpConnectState(int state);
    void setMacKey(unsigned char * p_dat ,  int i_size);              // 设置机器的密钥
    // 文件传输结果
public:

private:
    QTimer * m_pSendTimer;
    FileTransCtrl m_transCtrl;
    int m_fileTransEn;
    int m_transBreak;
    int m_totalSendNum;//传输文件时总共发送的包数
    int m_totalPacketNum;//传输文件时总的包数

private slots:
    void onSendTimer(void);
    void slIfOpenSerialPort(int val);//串口是否打开

signals:            // 发送给UI的信号
    void siMcInfoChange();                      // 机器信息改变信号
    void siDebugInfo();                            //调试信息改变信号
    void siReceiveLotData();                    // 接收物联数据信号
    void siStatusChange(int);                   // 状态改变信号
    void siParaChange(int type, int id);        // 参数更新信号
    void siMemDataChange(int beginAddr);        // 内存数据更新信号
    void siSensorChange(SensorsBitmap map);                      // 传感信号更新信号
    void siFileInfoChange();                    // 文件信息更新信号
    void siTransResultChange();                 // 文件传输结果信号
    void siTransProgress(u8 fileType, int send, int total);  // 文件传输结果信号
    void siSensorEnBitmap(SensorsBitmap map);                    // 传感信号有效位图更新信号
    void siDataFilePos(DataFilePos pos);     //  边框检查时起始点超出范围后下位机自动定新的起始点后发给上位机

public slots:
    void breakFileTrans();      // 打断文件传输

public: // 机器执行命令，读取下位机数据
    void getInfoFromMachine();
    int  getStatusFromMachine();
    void getNetDataFromMachine();     // 读取机器物联数据
    void getParasFromMachine(int type = -1, int id = 0);     // 读取机器参数
    void restoreFactorySetting(int type = -1); // 恢复出厂设置
    void getSensorsFromMachine(int backtype = 0);
    void getTransResultFromMachine(int fileid);
    void getSensorEnBmpFromMachine();    // 获取传感器有效标志位图
    void sleep(int sec);

public:     // 设置机器配置
// #define	UCMD_SET_MC_CONFIG		0x0101	VLDP	无		设置机器的配置，包括信号使用的端口等信息

public:    // 设置机器状态
    void setMcStatus(int stacode, int para = 0);
    void cleanError();                  // 清除错误    
    void setEnableWorkSta();            // 设置允许工作状态
    void setDisableWorkSta();           // 设置禁止工作状态
    void setEnableWorkTime();           // 设置允许工作时间状态
    void setDisableWorkTime();          // 设置禁止工作时间状态
    void resetOutput();                 // 重置产量
    void setToManualWork();             // 手动工作状态
    void setToAutoWork();               // 自动工作状态
    void switchWorkFile(int idx = 0);   // 文件切换
    void invalidateWorkFile(int idx = 0);	// 文件失效
    void cleanNewParaFlag();            // 清除新参数标志
    void setSimulateWork();             // 模拟工作状态
    void setNormalWork();               // 正常工作状态
    void exitDetectTest();               //退出断线测试
    void resetBobbinCounter();          // 底线计数复位
    void outputReset();                 // 产量清零
    void entrySensorScan();         	// 进入扫描传感器状态
    void exitSensorScan();          	// 退出扫描传感器状态
    void setElapsed(unsigned char i_type ,  unsigned char  i_time);    // 设置经过的时间
    void testThreadBK(int type,int needle); // 测试断线检测,1是面线，2是底线

public:    // 设置机器参数
    void setParasToMachine(int type, ParaStruct & para);
    void setAParasToMachine(int type, int idx, u32 value);
    void setShutDownTime(u8 type, u32 time);
    void setHeadSpacingToMachine(int type, QByteArray data, u16 paraId);
    void setMcPara(ParaStruct * pPara);
    void setWkPara(ParaStruct * pPara);
    void setMcPrePara(ParaStruct * pPara);//预留参数
    void setWkPrePara(ParaStruct * pPara);//预留参数
    void setAMcPara(int id, u32 value);
    void setAWkPara(int id, u32 value);
    void setAMcPrePara(int id, u32 value);//预留参数
    void setAWkPrePara(int id, u32 value);//预留参数

    void setHeadSpacing(DsrHeadEx62 para);

public:    // 设置内存数据
// #define	UCMD_SET_MEM_DATA		0x0104		// 设置内存数据

public:    // 设置文件参数
    void setFilePara(int fileidx, int fileid, DataFilePara & filePara);

public:    // 设置执行进度
    void setFileExecProgress(int fileidx, int fileid, FileExecPara & fileExecPara);
    void setToDefaultParas(int type, u8 id = 0, u8 nodeType = 0);
    int headup;

public slots:    // 手动控制命令
    void actionByhand(int actcode, int para1, int para2 = 0, int para3 = 0);
    void motoToZero(int obj);                       // 电机归零（辅助调试的功能，无安全保护和逻辑关系）
    void motoMove(int obj, int dir, int spd);       // 电机移动（辅助调试的功能，无安全保护和逻辑关系）
    void pullMove(int obj, int dir, int spd);       // 拉料移动（辅助调试的功能，无安全保护和逻辑关系）   coco
    void outputCtrl(int obj, int act = 0, int para = 0);    // 输出控制（辅助调试的功能，无安全保护和逻辑关系）
    void motoServoCtrl(int obj, int onoff);         // 电机使能控制（辅助调试的功能，无安全保护和逻辑关系）

    void sewingMsServoOn();
    void sewingMsServoOff();    // 缝纫主轴使能控制

    void manualAction(int obj, int para2 = 0, int para3 = 0);  // 手动动作功能（日常使用功能，有安全保护和逻辑时序关系）

    void cutThreadByhand();                     // 手动剪线
    void makeup(int mode);                              //补缝
    void msAdjust(int step);                    // 针梭校对
    void rotaAdjust(int step);                  // 旋转校对

    void sewHeadLiftUpDown();       // 机头升降
    void ThicklineSewHeadLiftUpDown();// 粗线布线机机头升降
    void sewHeadLiftUp();       // 机头上升
    void sewHeadLiftDown();     // 机头下降
    void sewingMsRun();         // 缝纫主轴研车
    void gotoGorner(int nNum);// 回角点
    void manualOil(int nNum);  // 手动加油
    void shuttleCounter();  //梭盘计数复位
    void changeOneShuttle();//自动换一个梭
    void installShuttle();  //安装第一个梭壳
    void sewBuff();         //缝纫状态
    void shuttleDiskBuff(); //换梭盘状态
    void shuttleToHead();   //将旋梭从梭盘到机头
    void headToShuttle();   //将旋梭从机头拿到梭盘
    void allMsRun();            // 所有主轴研车

    void headLift();                            // 机头升降
    void msReset();                             // 针梭复位
    void msToFix();                             // 针梭去穿线位
    void sewCutThread(int nNum);           // 缝纫剪线

    void moveFrameByHand(char xy, char dir, int spd); // 手动移框
    void sewJog();                              // 缝纫点动

public:    // 机器工作命令
    void mcWorkCmd(int workcode, int para1 = 0 , int para2 = 0);

    void startWork();       // 启动工作
    void pauseWork();       // 暂停工作
    void allToReset();      // 流程复位
    void allToZero();       // 全部归零

    void gotoStartPos();    // 回起针点
    void gotoAnchor();      // 回定位点
    void setOffsetPos();     // 定偏移点
    void gotoFinish();     // 回结束点
    void gotoOffsetPos();   // 回偏移点
    void setFeedPos();      // 定上料点
    void gotoFeedPos();     // 回上料点

    void checkFrame();      // 边框检查
    void simulateFrame();   // 空走边框

    void fastJump(int idx); // 前进回退
    void gotoWorkPos();     // 回工作点
    void gotoFixPos();      // 回穿线点
    void gotoShuttlePos();      // 回换梭位

    void gotoZeroPos();     // 回零点
    void msRpmChange(int chgram,int flag);     // 速度改变
    void mainShaftJog();// 主轴点动
    void embSpindleTest(s32 para1, s32 para2);        // 主轴研车

public:    // 移动到XY坐标命令
    void moveFrameTo(int x, int y);

public:     // 文件传输命令
    int sendFileProc(int type, int idx, int id, DataDs16FileHead * pfileHead, u8 * pDatBuff);
    int sendFileProc(int type, int idx, int id, DataDs16FileHead & fileHead, u8 * pDatBuff);
    int sendAPPFileProc(int type, int idx, int id, AppFileHead &fileHead, u8 *pDatBuff);

private:
    void startFileTrans(FileTransCtrl & transCtrl);
    void transFileData(FileTransCtrl & transCtrl, int pktidx);

public:    // 下位机系统升级命令
    void updateFirmware();    // 下位机升级
};

#endif // MACHINE_H

